package co.kr.caja.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.kr.caja.entidad.PersonaDTO;

public class PersonaDAOSqlServer {

	String crearPersonaSQL;
	String actualizarPersonaSQL;
	String consultarPersonaCodigoSQL;
	String consultarPersonaIdentificacionSQL;
	String consultarPersonaTodoSQL;

	public PersonaDAOSqlServer() {
		crearPersonaSQL = "";
		actualizarPersonaSQL = "";
		consultarPersonaCodigoSQL = "";
		consultarPersonaIdentificacionSQL = "";
		consultarPersonaTodoSQL = "";
	}

	public void crear(PersonaDTO personaDTO, Connection conexion) throws SQLException {
		crearPersonaSQL = "INSERT INTO Persona (identificacion, nombre, apellido, celular, correo) VALUES (?, ?, ?, ?, ?)";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(crearPersonaSQL)) {
			sentenciaPreparada.setString(1, personaDTO.getIdentificacion());
			sentenciaPreparada.setString(2, personaDTO.getNombre());
			sentenciaPreparada.setString(3, personaDTO.getApellido());
			sentenciaPreparada.setInt(4, personaDTO.getCelular());
			sentenciaPreparada.setString(5, personaDTO.getCorreo());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un probema creando el campo en la tabla Persona: " + excepcion.getMessage());
			throw excepcion;
		}
	}

	public void actualizar(PersonaDTO personaDTO, Connection conexion) throws SQLException {
		actualizarPersonaSQL = "UPDATE Persona SET identificacion = ISNULL(?, identificacion), nombre = ISNULL(?, nombre), apellido = ISNULL(?, apellido), celular = ISNULL(?, celular), correo = ISNULL(?, correo) WHERE codigo_persona = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(actualizarPersonaSQL)) {
			sentenciaPreparada.setString(1, personaDTO.getIdentificacion());
			sentenciaPreparada.setString(2, personaDTO.getNombre());
			sentenciaPreparada.setString(3, personaDTO.getApellido());
			sentenciaPreparada.setInt(4, personaDTO.getCelular());
			sentenciaPreparada.setString(5, personaDTO.getCorreo());
			sentenciaPreparada.setInt(6, personaDTO.getCodigoPersona());
			sentenciaPreparada.executeUpdate();
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema actualizando el campo de Persona: " + excepcion.getMessage());
			throw excepcion;
		}
	}

	public PersonaDTO consultarPorCodigo(PersonaDTO personaDTO, Connection conexion) throws SQLException {
		PersonaDTO personaDTOResultado = null;
		consultarPersonaCodigoSQL = "SELECT codigo_persona, identificacion, nombre, apellido, celular, correo FROM Persona WHERE codigo_persona = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarPersonaCodigoSQL)) {
			sentenciaPreparada.setInt(1, personaDTO.getCodigoPersona());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					personaDTOResultado = new PersonaDTO();
					personaDTOResultado.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					personaDTOResultado.setIdentificacion(cursorResultado.getString("identificacion"));
					personaDTOResultado.setNombre(cursorResultado.getString("nombre"));
					personaDTOResultado.setApellido(cursorResultado.getString("apellido"));
					personaDTOResultado.setCelular(cursorResultado.getInt("celular"));
					personaDTOResultado.setCorreo(cursorResultado.getString("correo"));
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Persona por codigo: " + excepcion.getMessage());
			throw excepcion;
		}
		return personaDTOResultado;
	}

	public PersonaDTO consultarPorIdentificacion(PersonaDTO personaDTO, Connection conexion) throws SQLException {
		PersonaDTO personaDTOResultado = null;
		consultarPersonaIdentificacionSQL = "SELECT codigo_persona, identificacion, nombre, apellido, celular, correo FROM Persona WHERE identificacion = ?";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarPersonaIdentificacionSQL)) {
			sentenciaPreparada.setString(1, personaDTO.getIdentificacion());
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				if (cursorResultado.next()) {
					personaDTOResultado = new PersonaDTO();
					personaDTOResultado.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					personaDTOResultado.setIdentificacion(cursorResultado.getString("identificacion"));
					personaDTOResultado.setNombre(cursorResultado.getString("nombre"));
					personaDTOResultado.setApellido(cursorResultado.getString("apellido"));
					personaDTOResultado.setCelular(cursorResultado.getInt("celular"));
					personaDTOResultado.setCorreo(cursorResultado.getString("correo"));
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando la tabla Persona por identificacion: " + excepcion.getMessage());
			throw excepcion;
		}
		return personaDTOResultado;
	}

	public ArrayList<PersonaDTO> consultarTodo(Connection conexion) throws SQLException {
		ArrayList<PersonaDTO> personaDTOLista = new ArrayList<PersonaDTO>();
		PersonaDTO personaDTOResultado = null;
		consultarPersonaTodoSQL = "SELECT codigo_persona, identificacion, nombre, apellido, celular, correo FROM Persona";
		try (PreparedStatement sentenciaPreparada = conexion.prepareStatement(consultarPersonaTodoSQL)) {
			try (ResultSet cursorResultado = sentenciaPreparada.executeQuery()) {
				while (cursorResultado.next()) {
					personaDTOResultado = new PersonaDTO();
					personaDTOResultado.setCodigoPersona(cursorResultado.getInt("codigo_persona"));
					personaDTOResultado.setIdentificacion(cursorResultado.getString("identificacion"));
					personaDTOResultado.setNombre(cursorResultado.getString("nombre"));
					personaDTOResultado.setApellido(cursorResultado.getString("apellido"));
					personaDTOResultado.setCelular(cursorResultado.getInt("celular"));
					personaDTOResultado.setCorreo(cursorResultado.getString("correo"));
					personaDTOLista.add(personaDTOResultado);
				}
			}
		} catch (SQLException excepcion) {
			System.err.println("Se ha presentado un problema consultando toda la tabla de Persona: " + excepcion.getMessage());
			throw excepcion;
		}
		return personaDTOLista;
	}
}
